import threading
from faker import Faker
import time
import random

# 初始化Faker实例（注意：Faker本身不是线程安全的，需要控制访问）
fake = Faker(locale="zh-CN")

# 创建线程锁，确保数据操作的原子性
data_lock = threading.Lock()

# 共享数据存储
user_data_list = []


def generate_user_data(thread_id):
    """生成用户数据并安全添加到共享列表"""
    global user_data_list

    try:
        # 生成模拟数据（Faker操作在锁外，提高效率）
        user_data = {
            "thread_id": thread_id,
            "name": fake.name(),
            "phone": fake.phone_number(),
            "address": fake.address().replace("\n", ", "),  # 处理换行符
            "email": fake.email(),
            "birthdate": fake.date_of_birth().strftime("%Y-%m-%d")
        }

        # 模拟数据处理耗时
        time.sleep(random.uniform(0.1, 0.3))

        # 使用线程锁保护共享数据的修改
        with data_lock:
            user_data_list.append(user_data)
            print(f"线程 {thread_id} 已添加数据: {user_data['name']}")

    except Exception as e:
        print(f"线程 {thread_id} 错误: {str(e)}")


def main():
    # 创建并启动15个线程
    threads = []
    for i in range(15):
        thread = threading.Thread(target=generate_user_data, args=(i,))
        threads.append(thread)
        thread.start()
        print(f"线程 {i} 启动")

    # 等待所有线程完成
    for thread in threads:
        thread.join()

    # 输出最终结果
    print(f"\n所有线程执行完毕，共生成 {len(user_data_list)} 条数据:")
    for idx, data in enumerate(user_data_list[:5]):  # 只显示前5条
        print(f"{idx + 1}. {data['name']} - {data['phone']} - {data['email']}")
    if len(user_data_list) > 5:
        print(f"... 还有 {len(user_data_list) - 5} 条数据未显示")


if __name__ == "__main__":
    main()
